--for:在配方中添加自定义的人物属性，类似于mod角色使用自定义的特殊属性作为材料制作某个配方



--第一步，添加全局变量，用于自定义属性消耗的名称
GLOBAL.CHARACTER_INGREDIENT.NANAPOWER = 'nanapower_make'


--第二步，修改IsCharacterIngredient函数，用于添加自定义属性消耗的判断
-- 注意这一步的ingredienttype判断不能使用全局变量，因为该函数执行优先级较高，添加全局变量的操作在该函数之后才执行，所以直接判断GLOBAL.CHARACTER_INGREDIENT.NANAPOWER会为nil
local oldIsCharacterIngredient = GLOBAL.IsCharacterIngredient -- 保存原始函数
GLOBAL.IsCharacterIngredient = function(ingredienttype)
    -- 对特定参数直接返回 true
    if ingredienttype == "nanapower_make" then return true end
    -- 其他情况使用原始函数
    return oldIsCharacterIngredient(ingredienttype)
end


--第三步，重写builder组件，用于添加自定义消耗处理的检查逻辑
--具体函数功能请见源码解析笔记，这里不再赘述
AddComponentPostInit("builder",
    function(self, inst)
        if not TheWorld.ismastersim then return end

        --加入我们自己的检查逻辑
        --函数用于检查角色是否拥有足够的特定类型成分（如生命值、最大生命值、理智值等）来满足制作需求。
        local oldHasCharacterIngredient = self.HasCharacterIngredient
        function self:HasCharacterIngredient(ingredient)
            if ingredient.type == CHARACTER_INGREDIENT.NANAPOWER then
                if self.inst.components.nana_power ~= nil then
                    local current = math.ceil(
                        self.inst.components.nana_power.nana_power)
                    return current >= ingredient.amount, current
                end
            end
            return oldHasCharacterIngredient(self, ingredient)
        end

        --加入我们自己的消耗逻辑
        --函数主要用于从玩家的物品栏中移除制作物品所需的材料，并根据配方消耗相应的角色资源（如生命值、理智值等）。
        local oldRemoveIngredients = self.RemoveIngredients
        function self:RemoveIngredients(ingredients, recname, discounted)
            if self.freebuildmode then -- 添加免费建造模式检查
                return oldRemoveIngredients(self, ingredients, recname, discounted)
            end

            local recipe = AllRecipes[recname]
            if recipe then
                for k, v in pairs(recipe.character_ingredients) do
                    if v.type == CHARACTER_INGREDIENT.NANAPOWER then
                        self.inst.components.nana_power:AddNanaPower(-v.amount) --这个组件是我自己mod里写的，这边只要写自己的消耗逻辑就行
                    end
                end
            end
            return oldRemoveIngredients(self, ingredients, recname, discounted)
        end
    end)
--补充，修改客户端的builder_replica，否则客户端显示会有问题
    do
        local builder_replica = require "components/builder_replica"
        local oldHasCharacterIngredient = builder_replica.HasCharacterIngredient
        function builder_replica:HasCharacterIngredient(ingredient, ...)
            if self.inst.components.builder ~= nil then
            elseif self.classified ~= nil then
                if ingredient.type == GLOBAL.CHARACTER_INGREDIENT.NANAPOWER then
                    --这里需要改
                    local current = math.ceil(
                        self.inst.replica.nana_power.nana_power)
                    return current >= ingredient.amount, current
                end
            end
            return oldHasCharacterIngredient(self, ingredient, ...)
        end
    end



--第四步，添加游戏配方
local recipe_name = "nana_tougarashi_gem" -- 配方唯一名称，不可重复，通常用prefab名
local ingredients = {
    Ingredient(CHARACTER_INGREDIENT.NANAPOWER, 50, 'images/nanapower_make.xml')
}                                                             -- 原料表，注意xml中指定的tex名需要和参数1保持一致
local tech = TECH.NONE                                        -- 所需科技，必须使用常量表TECH的值
local config = {
    atlas = "images/inventoryimages/nana_tougarashi_gem.xml", --路径，如果atlas中路径的名字与配方名不同，需要用image指定对应的图片名，否则会丢失图片
    builder_tag = 'esctemplate'                               --拥有该标签才能建造
}
AddCharacterRecipe(recipe_name, ingredients, tech, config, nil)

STRINGS.NAMES[string.upper("nana_tougarashi_gem")] = '唐辛子宝石' --物品名
STRINGS.CHARACTERS.GENERIC.DESCRIBE[string.upper("nana_tougarashi_gem")] = --通用（威尔逊）检查语言
'这是唐辛子宝石'
STRINGS.RECIPE_DESC[string.upper("nana_tougarashi_gem")] = --制作栏描述
'制作唐辛子宝石'
